package com.wms.common.utils;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.wms.common.exception.ServiceException;

import java.util.Collection;
import java.util.function.Supplier;

public class Assert {

    /**
     * 是真
     *
     * @param expression       表达式
     * @param errorMsgTemplate
     * @param params           参数个数
     * @author
     * @since 2022/07/29
     */
    public static void isTrue(boolean expression, String errorMsgTemplate, Object... params) {
        isTrue(expression, () -> new ServiceException(StrUtil.format(errorMsgTemplate, params)));
    }


    /**
     * 是真
     *
     * @param expression
     * @param supplier
     * @throws X x
     * @author
     * @since 2022/07/29
     */
    public static <X extends Throwable> void isTrue(boolean expression, Supplier<? extends X> supplier) throws X {
        if (false == expression) {
            throw supplier.get();
        }
    }




    /**
     * 是假
     *
     * @param expression       表达式
     * @param errorMsgTemplate 错误味精模板
     * @param params           参数个数
     * @author
     * @since 2022/07/29
     */
    public static void isFalse(boolean expression, String errorMsgTemplate, Object... params) {
        isFalse(expression, () -> new ServiceException(StrUtil.format(errorMsgTemplate, params)));
    }

    /**
     * 是假
     *
     * @param expression    表达式
     * @param errorSupplier
     * @throws X x
     * @author
     * @since 2022/07/29
     */
    public static <X extends Throwable> void isFalse(boolean expression, Supplier<X> errorSupplier) throws X {
        if (expression) {
            throw errorSupplier.get();
        }
    }


    /**
     * 为空则抛出异常
     *
     * @param t                被检查的对象
     * @param errorMsgTemplate 消息模板，变量使用
     * @param params           参数列表
     * @author
     * @since 2022/07/29
     */
    public static void isNotNull(Object t, String errorMsgTemplate, Object... params) {
        isNotNull(t, () -> new ServiceException(StrUtil.format(errorMsgTemplate, params)));
    }

    /**
     * <p>字符串是否为非空白，非空白的定义如下： </p>
     * <ol>
     * <li>不为 {@code null}</li>
     * <li>不为空字符串：{@code ""}</li>
     * <li>不为空格、全角空格、制表符、换行符，等不可见字符</li>
     * </ol>
     *
     * <p>例：</p>
     * <ul>
     * <li>{@code StrUtil.isNotBlank(null)     // false}</li>
     * <li>{@code StrUtil.isNotBlank("")       // false}</li>
     * <li>{@code StrUtil.isNotBlank(" \t\n")  // false}</li>
     * <li>{@code StrUtil.isNotBlank("abc")    // true}</li>
     * </ul>
     * *
     *
     * @param str              被检测的字符串
     * @param errorMsgTemplate 错误味精模板
     * @param params           参数个数
     * @author
     * @since 2023/05/06
     */
    public static void isNotBlank(CharSequence str, String errorMsgTemplate, Object... params) {
        isNotBlank(str, () -> new ServiceException(StrUtil.format(errorMsgTemplate, params)));
    }

    /**
     * 空为真
     * <p>
     * 判断是空 如果不是 则抛异常
     *
     * @param str              str
     * @param errorMsgTemplate 错误味精模板
     * @param params           参数个数
     * @author
     * @since 2023/08/25
     */
    public static void isBlank(CharSequence str, String errorMsgTemplate, Object... params) {
        isBlank(str, () -> new ServiceException(StrUtil.format(errorMsgTemplate, params)));
    }

    /**
     * 空为真
     * <p>
     * 判断是空 如果不是 则抛异常
     *
     * @param str           str
     * @param errorSupplier 错误供应商
     * @throws X x
     * @author
     * @since 2023/08/25
     */
    public static <X extends Throwable> void isBlank(CharSequence str, Supplier<X> errorSupplier) throws X {
        if (StrUtil.isNotBlank(str)) {
            throw errorSupplier.get();
        }
    }

    /**
     * 为空则抛出异常
     *
     * @param t             被检查的对象
     * @param errorSupplier
     * @throws X x
     * @author
     * @since 2022/07/29
     */
    public static <X extends Throwable> void isNotNull(Object t, Supplier<X> errorSupplier) throws X {
        if (null == t) {
            throw errorSupplier.get();
        }
    }

    /**
     * 判断字符不为空，为空，则抛出异常
     *
     * @param str           str
     * @param errorSupplier 错误供应商
     * @throws X x
     * @author
     * @since 2023/05/06
     */
    public static <X extends Throwable> void isNotBlank(CharSequence str, Supplier<X> errorSupplier) throws X {
        if (StrUtil.isBlank(str)) {
            throw errorSupplier.get();
        }
    }


    /**
     * 为空
     * 断言对象是否为{@code null} ，如果不为{@code null} 抛出{@link } 异常
     *
     * @param t                被检查的对象
     * @param errorMsgTemplate 消息模板，变量使用
     * @param params           参数列表
     * @author
     * @since 2022/07/29
     */
    public static void isNull(Object t, String errorMsgTemplate, Object... params) {
        isNull(t, () -> new ServiceException(StrUtil.format(errorMsgTemplate, params)));
    }

    /**
     * 为空
     *
     * @param t             被检查的对象
     * @param errorSupplier
     * @throws X x
     * @author
     * @since 2022/07/29
     */
    public static <X extends Throwable> void isNull(Object t, Supplier<X> errorSupplier) throws X {
        if (null != t) {
            throw errorSupplier.get();
        }
    }

    /**
     * 认定元素不是空 如果是空 则抛异常
     *
     * @param collection       集合
     * @param errorMsgTemplate 自定义异常信息
     * @param params           参数个数
     * @return {@link Collection <?> }
     * @author
     * @since 2022/10/28
     */
    public static <T> Collection<?> isNotEmpty(Collection<?> collection, String errorMsgTemplate, Object... params) {
        return isNotEmpty(collection, () -> new ServiceException(StrUtil.format(errorMsgTemplate, params)));
    }

    /**
     * 认定元素不是空 如果是空 则抛异常
     *
     * @param collection    集合
     * @param errorSupplier
     * @return {@link Collection<?> }
     * @throws X x
     * @author tengzhiqiang
     * @since 2022/10/28
     */
    public static <T, X extends Throwable> Collection<?> isNotEmpty(Collection<?> collection, Supplier<X> errorSupplier) throws X {
        if (CollUtil.isEmpty(collection)) {
            throw errorSupplier.get();
        }
        return collection;
    }

    /**
     * 认定元素是空 如果不是空 则抛异常
     *
     * @param collection       集合
     * @param errorMsgTemplate 自定义异常信息
     * @param params           参数个数
     * @return {@link Collection<?> }
     * @author
     * @since 2022/10/28
     */
    public static <T> Collection<?> isEmpty(Collection<?> collection, String errorMsgTemplate, Object... params) {
        return isEmpty(collection, () -> new ServiceException(StrUtil.format(errorMsgTemplate, params)));
    }

    /**
     * 认定元素是空 如果不是空 则抛异常
     *
     * @param collection    集合
     * @param errorSupplier 自定义异常信息
     * @return {@link Collection<?> }
     * @throws X x
     * @author
     * @since 2022/10/28
     */
    public static <T, X extends Throwable> Collection<?> isEmpty(Collection<?> collection, Supplier<X> errorSupplier) throws X {
        if (CollUtil.isNotEmpty(collection)) {
            throw errorSupplier.get();
        }
        return collection;
    }

}
